#pragma once
#include <d3d11.h>
#include <map>
#include <string>

using namespace std;

class IConstantBuffer;

class ShaderContainer
{
	ID3D11VertexShader* vertexShader = nullptr;
	ID3D11DomainShader* domainShader = nullptr;
	ID3D11HullShader* hullShader = nullptr;
	ID3D11GeometryShader* geometryShader = nullptr;
	ID3D11PixelShader* pixelShader = nullptr;
	
public:
	ShaderContainer(void);
	ShaderContainer(ID3D11VertexShader* vertexShader, ID3D11PixelShader* pixelShader);
	~ShaderContainer(void);

	/////////////////////////<Accessors>///////////////////////////////////////////////////

	ID3D11PixelShader* getPixelShader(void) const { return pixelShader; }
	ID3D11VertexShader* getVertexShader(void) const { return vertexShader; }
	ID3D11GeometryShader* getGeometryShader(void) const { return geometryShader; }

	/////////////////////////<Mutators>///////////////////////////////////////////////////

	void setVertexShader(ID3D11VertexShader* value) { vertexShader = value; }
	void setPixelShader(ID3D11PixelShader* value) { pixelShader = value; }
	void setGeometryShader(ID3D11GeometryShader* value) { geometryShader = value; }
	void setHullShader(ID3D11HullShader* value) { hullShader = value; }
	void setDomainShader(ID3D11DomainShader* value) { domainShader = value; }

	/////////////////////////<Public Functions>///////////////////////////////////////////////////

	void MakeVertexShader(BYTE* shaderCode, unsigned int codeSize);
	void MakePixelShader(BYTE* shaderCode, unsigned int codeSize);
	void MakeGeometryShader(BYTE* shaderCode, unsigned int codeSize);

	void Bind(void);
};